﻿using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Phone.UI.Input;
using Windows.UI;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace 轻小说文库 {
	/// <summary>
	/// Provides application-specific behavior to supplement the default Application class.
	/// </summary>
	sealed partial class App : Application {
		/// <summary>
		/// Initializes the singleton application object.  This is the first line of authored code
		/// executed, and as such is the logical equivalent of main() or WinMain().
		/// </summary>
		public App() {
			this.InitializeComponent();
			this.Suspending += OnSuspending;
		}

		/// <summary>
		/// Invoked when the application is launched normally by the end user.  Other entry points
		/// will be used such as when the application is launched to open a specific file.
		/// </summary>
		/// <param name="e">Details about the launch request and process.</param>
		protected override void OnLaunched(LaunchActivatedEventArgs e) {
			Frame rootFrame = Window.Current.Content as Frame;

			// Do not repeat app initialization when the Window already has content,
			// just ensure that the window is active
			if (rootFrame == null) {
				// Create a Frame to act as the navigation context and navigate to the first page
				rootFrame = new Frame();

				rootFrame.NavigationFailed += OnNavigationFailed;

				if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) {
					//TODO: Load state from previously suspended application
				}

				// Place the frame in the current Window
				Window.Current.Content = rootFrame;
			}

			if (e.PrelaunchActivated == false) {
				if (rootFrame.Content == null) {
					// When the navigation stack isn't restored navigate to the first page,
					// configuring the new page by passing required information as a navigation
					// parameter
					rootFrame.Navigate(typeof(MainPage), e.Arguments);
				}
				// Ensure the current window is active
				Window.Current.Activate();
			}

			// 设置标题栏颜色
			var titleBar = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().TitleBar;
			titleBar.BackgroundColor = Color.FromArgb(255, 0, 122, 204);
			titleBar.ButtonBackgroundColor = Color.FromArgb(255, 0, 122, 204);
			titleBar.ButtonHoverBackgroundColor = Color.FromArgb(255, 0, 122, 224);
			titleBar.ButtonPressedBackgroundColor = Color.FromArgb(255, 0, 122, 184);
			titleBar.ButtonInactiveBackgroundColor = Color.FromArgb(255, 0, 122, 224);
			titleBar.InactiveBackgroundColor = Color.FromArgb(255, 0, 122, 224);

			// 添加对鼠标XButton1的响应
			Window.Current.CoreWindow.PointerPressed += OnPointerPressed;

			// 设置标题栏返回键
			SystemNavigationManager.GetForCurrentView().BackRequested += BackRequested;
			SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = MainPage.ContentFrame.CanGoBack ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
			MainPage.ContentFrame.Navigated += OnNavigated;
		}

		/// <summary>
		/// Invoked when application execution is being suspended.  Application state is saved
		/// without knowing whether the application will be terminated or resumed with the contents
		/// of memory still intact.
		/// </summary>
		/// <param name="sender">The source of the suspend request.</param>
		/// <param name="e">Details about the suspend request.</param>
		private void OnSuspending(object sender, SuspendingEventArgs e) {
			var deferral = e.SuspendingOperation.GetDeferral();
			//TODO: Save application state and stop any background activity
			if (HTMLParser.GetHttpClientInstance() != null) {
				HTMLParser.GetHttpClientInstance().Dispose();
			}
			deferral.Complete();
		}

		/// <summary>
		/// Invoked when Navigation to a certain page fails
		/// </summary>
		/// <param name="sender">The Frame which failed navigation</param>
		/// <param name="e">Details about the navigation failure</param>
		void OnNavigationFailed(object sender, NavigationFailedEventArgs e) {
			throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
		}

		/// <summary>
		/// 处理鼠标侧面导航键（XButton1）
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="args"></param>
		private void OnPointerPressed(CoreWindow sender, PointerEventArgs args) {
			var props = args.CurrentPoint.Properties;
			if (!props.IsLeftButtonPressed && !props.IsMiddleButtonPressed && !props.IsRightButtonPressed
				&& props.IsXButton1Pressed != props.IsXButton2Pressed) {
				if (props.IsXButton1Pressed && MainPage.ContentFrame.CanGoBack) {
					MainPage.ProgressRing.IsActive = true;
					MainPage.ProgressRing.Visibility = Visibility.Visible;
					MainPage.ContentFrame.GoBack();
					args.Handled = true;
				}
			}
		}

		bool isTop = false;
		/// <summary>
		/// 标题栏返回键 事件处理
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void BackRequested(object sender, BackRequestedEventArgs e) {
			if (MainPage.ContentFrame.CanGoBack) {
				MainPage.ProgressRing.IsActive = true;
				MainPage.ProgressRing.Visibility = Visibility.Visible;
				MainPage.ContentFrame.GoBack();
				isTop = false;
			}
			else if (isTop) {
				App.Current.Exit();
			}
			else {
				isTop = true;
			}
			e.Handled = true;
		}

		/// <summary>
		/// 控制标题栏返回键的可见性
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void OnNavigated(object sender, NavigationEventArgs e) {
			SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = ((Frame)sender).CanGoBack ?
				AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
		}
	}
}
